#include<bits/stdc++.h>
using namespace std;
const int NN=5e4+4;
int len;
struct query
{
	int l,r,id;
	bool operator<(const query&it)const
	{
		if(l/len==it.l/len)
			return l/len%2?r<it.r:r>it.r;
		return l/len<it.l/len;
	}
}q[NN];
vector<int>g[NN];
int lp[NN*2][24],lg2[NN*2],idx,id[NN],d[NN],dfn[NN],idfn[NN],tim,a[NN],ans[NN],cnt[NN];
void dfs(int u)
{
	dfn[u]=++tim;
	idfn[tim]=u;
	id[u]=++idx;
	lp[idx][0]=u;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		d[v]=d[u]+1;
		dfs(v);
		lp[++idx][0]=u;
	}
}
int check(int u,int v)
{
	if(d[u]<d[v])
		return u;
	return v;
}
int lca(int u,int v)
{
	int l=id[u],r=id[v];
	if(l>r)
		swap(l,r);
	return check(lp[l][lg2[r-l+1]],lp[r-(1<<lg2[r-l+1])+1][lg2[r-l+1]]);
}
set<int>st;
int res;
void adc(int x,int w)
{
	res-=cnt[x]>0;
	cnt[x]+=w;
	res+=cnt[x]>0;
}
void add(int p,int w)
{
	if(w==-1)
		st.erase(dfn[p]);
	auto it=st.lower_bound(dfn[p]);
	int pl=0,pr=0;
	if(it!=st.end())
		pr=idfn[*it];
	if(it!=st.begin())
	{
		it--;
		pl=idfn[*it];
	}
	adc(p,w);
	if(pr)
		adc(lca(pr,p),w);
	if(pl)
		adc(lca(pl,p),w);
	if(pl&&pr)
		adc(lca(pl,pr),-w);
	if(w==1)
		st.insert(dfn[p]);
}
int main()
{
	freopen("escape.in","r",stdin);
	freopen("escape.out","w",stdout);
	int n,m;
	scanf("%d%d",&n,&m);
	len=max(1,(int)sqrt(n));
	for(int i=2;i<=n;i++)
	{
		int fa;
		scanf("%d",&fa);
		g[fa].push_back(i);
	}
	d[1]=1;
	dfs(1);
	lg2[0]=-1;
	for(int i=1;i<=idx;i++)
		lg2[i]=lg2[i>>1]+1;
	for(int i=1;i<=20;i++)
		for(int j=1;j+(1<<i)-1<=idx;j++)
			lp[j][i]=check(lp[j][i-1],lp[j+(1<<i-1)][i-1]);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+1+m);
	for(int l=1,r=0,i=1;i<=m;i++)
	{
		while(l>q[i].l)
			add(a[--l],1);
		while(r<q[i].r)
			add(a[++r],1);
		while(l<q[i].l)
			add(a[l++],-1);
		while(r>q[i].r)
			add(a[r--],-1);
		ans[q[i].id]=res;
	}
	for(int i=1;i<=m;i++)
		printf("%d\n",ans[i]);
	return 0;
}
